#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
 /*
//253:丛林中的路
int n;int res;
struct Edge{
    int a,b;
    int cost;    
};
struct Rule1{
    bool operator()(const Edge &a1,const Edge &a2){
        return a1.cost<a2.cost;
    }
};
int root[30];
Edge edges[600];
void initSet(){
    for(int i=0;i<=n;i++){
        root[i]=i;
    }
}
int findRoot(int x){
    while(root[x]!=x){
        x=root[x];
    }
    return x;
}
*/

/*
//1526:宗教信仰
int n,m,ans,NO=1,x,y;
int flag[50005];
//root[i]表示i节点在一个集合中的根节点(能唯一表示一个集合)
int root[50005];
//初始化每个节点的根节点为其自己
void initSet(){
    for(int i=1;i<=n;i++){
        root[i]=i;
    }
}
//根据节点数字找到集合的根节点
int findRoot(int x){
    while(x!=root[x]){
        x=root[x];
    }
    return x;
}
//把两个节点放到一个集合里
void unionSet(int x,int y){
    int setX,setY;
    setX=findRoot(x);setY=findRoot(y);
    if(setX!=setY){
        root[setY]=setX;
    }
}
*/
int main(){
    /*
    //1526:宗教信仰
    while(cin>>n>>m){
        //结束标记
        if(n==0) return 0;
        //初始化
        memset(flag,0,sizeof(flag));memset(root,0,sizeof(root));ans=0;
        initSet();
        //处理输入
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            //将相连的两个节点放到一个集合中
            unionSet(x,y);
        }
        for(int i=1;i<=n;i++){
            //统计全部节点共有多少集合
            if(flag[findRoot(i)]==0){
                ans++;
                flag[findRoot(i)]=1;
            }
        }
        cout<<"Case "<<NO<<": "<<ans<<endl;
        NO++;
    }
    */
   /*
    //253:丛林中的路
    //使用克鲁斯卡尔算法求最小生成树
    while(cin>>n){
        if(n==0) return 0;
        char src;int srcN;
        initSet();
        res=0;int edgeN=0;
        for(int i=0;i<n-1;i++){
            cin>>src>>srcN;
            for(int j=0;j<srcN;j++){
                char dest;int cost;
                cin>>dest>>cost;
                edges[edgeN].a=src-'A';edges[edgeN].b=dest-'A';edges[edgeN].cost=cost;
                edgeN++;
            }
        }
        sort(edges,edges+edgeN,Rule1());        
        int temp=0;
        for(int i=0;i<edgeN;i++){
            int a=findRoot(edges[i].a),b=findRoot(edges[i].b);
            if(a!=b){
                root[b]=a;
                res+=edges[i].cost;
                temp++;
                if(temp==n-1){
                    break;
                }
            }        
        }
        cout<<res<<endl;
    }
    */
    return 0;
}